﻿using System;
using System.Collections.Generic;
using Sunny.UI;
using System.Windows.Forms;
using System.Drawing;

namespace Easily._02_Form._01_frmCtrlConfig
{
    //【2021/3/22】 添加变量窗体
    public partial class frmVariableInit : Form
    {
        #region 只读数据
        /// <summary>
        /// 字典：存储变量类型及其释义
        /// </summary>
        private Dictionary<string, string> VarTypes = new Dictionary<string, string>()
        {
            { "uint8_t","不优化无符号8位数\n可以表示一个字节"},
            { "uint16_t","不优化无符号16位数\n可以表示一个字"},
            { "uint32_t","不优化无符号32位数\n可以表示一个长字"}
        };
        #endregion
        /*
         添加属性：
        变量类型（Type)、变量名（Name）、记录变量值（Value）、局部还是全局变量（IsLocal）
         */
        private GeneralIcon MyIcon = null;  //保存传入的控件对象
        private string Type = "";//变量类型
        private string VarName = "";//变量名
        private int VarValue = 0;//变量值（Name=Value） 既可以记录数字，也可以记录某个函数返回值（Value=FuncName(参数1，参数2...)）
        private bool isLocal = true;//默认为局部变量
        //private int AddValue = 0;
        /// <summary>
        /// 构造函数
        ///主要功能：加载保存的控件设置；生成初始代码；
        /// </summary>
        /// <param name="icon"></param>
        public frmVariableInit(GeneralIcon icon)
        {
            InitializeComponent();
            this.MyIcon = icon;
           
            //读取保存数据VarTypes
            if (MyIcon.code.Save != "")
            {
                //保存的参数以英文分号';'分开
                string[] tmp = MyIcon.code.Save.Split(';');
                //isLocal + ";" + Type + ";" + VarName + ";" + VarValue + ";" + AddValue + ";";
                isLocal = bool.Parse(tmp[0]);
                checkBox_isLocal.Checked = isLocal;
                Type = tmp[1];
                foreach (UIRadioButton btn in uibtnGroup.Controls)
                {
                    if (btn.Text == Type)
                        btn.Checked = true;
                }
                VarName = tmp[2];
                txt_Name.Text = VarName;
                VarValue = int.Parse(tmp[3]);
                txtValue.Text = VarValue.ToString();
                //AddValue = int.Parse(tmp[4]);
            }
            //如果没有设置变量名
            //也就相当于没有定义变量
            //所以不可以对其进行其他操作
            if (VarName == "" || VarName == "请输入变量名")
            {
                uiPanelSetValue.Enabled = false;
            }
            //默认显示
            btn_confirm_Click(new object(), new EventArgs());//触发确认
        }


        /// <summary>
        /// 确认后生成printf对应代码
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_confirm_Click(object sender, EventArgs e)
        {
            MyIcon.code.Clear();//清空以前代码
            //设置了变量类型
            if (Type != "")
            {
                //设置了变量名
                if (VarName != "" || VarName != "请输入变量名")
                {
                    //局部变量还是全局变量
                    if(isLocal)
                    {
                        MyIcon.code.LocalVariable += Type + " " + VarName + ";\r\n";//变量类型
                    }
                    else
                    {
                        MyIcon.code.GlobalVariable += Type + " " + VarName + ";\r\n";//变量类型
                    }
                    //设置变量初值
                    MyIcon.code.InitVariable += VarName + " = " + VarValue + ";\r\n";
                    //if (AddValue != 0)
                    //{
                    //    MyIcon.code.InsertCode+= VarName + " += " + AddValue + ";\r\n";
                    //}
                }
                //把四部分（变量前输出字符串+变量格式+变量后输出字符串+变量）组合成printf函数

                //存储变量参数 以分号间隔
                MyIcon.code.Save = isLocal + ";" + Type + ";" + VarName + ";" + VarValue + ";" 
                    //+ AddValue + ";"
                    ;
                //设置注释
                MyIcon.code.Comment = "定义变量";


                //外部会对此进行判断，因此是必要的
                this.DialogResult = DialogResult.OK;
            }
            else
            {
                lab_Type_Tip.ForeColor = Color.Red;
            }
            //else
            //{
            //    MessageBox.Show("请设置该变量类型！");
            //}
            ////设置了变量名 却没有设置变量类型
            //else if(VarName != "" && VarName != "请输入变量名")
            //{
            //    MessageBox.Show("请设置该变量类型！");
            //}

        }

        private void txt_Name_TextChanged(object sender, EventArgs e)
        {
            //开头加上一个字符 既标识了这个变量 也避免以其他开头字符出现错误
            if(checkBox_isLocal.Checked)
            {
                if(!txt_Name.Text.StartsWith("b_"))
                    VarName = "b_" + txt_Name.Text;
                else
                    VarName = txt_Name.Text;
            }
            else
            {
                if (!txt_Name.Text.StartsWith("g_"))
                    VarName = "g_" + txt_Name.Text;
                else
                    VarName = txt_Name.Text;
            }
            //输入后 可以设置变量值
            uiPanelSetValue.Enabled = true;
        }

        private void checkBox_isLocal_ValueChanged(object sender, bool value)
        {
            isLocal = value;
        }

        private void txtValue_TextChanged(object sender, EventArgs e)
        {
            VarValue = int.Parse(txtValue.Text);
        }

        private void uiRadioButton_ValueChanged(object sender, bool value)
        {
            if(((UIRadioButton)sender).Checked)
            {
                Type = ((UIRadioButton)sender).Text;
                lab_Type_Tip.Text = VarTypes[Type];
                lab_Type_Tip.ForeColor = Color.Black;
            }
        }

        private void btn_comment_Click(object sender, EventArgs e)
        {
            using (frmNodeEditer NE = new frmNodeEditer(this.MyIcon.code.Comment))
            {
                if (NE.ShowDialog() == DialogResult.OK)
                    this.MyIcon.code.Comment = NE.NoteEdit;
            }
        }
    }


}
